W ostatnich dwóch rozdziałach zobaczyliśmy, jak tworzyć geometrię części i tworzyć obiekty parametryczne. Brakuje jeszcze jednego elementu, aby uzyskać pełną kontrolę nad FreeCAD: Tworzenie narzędzi, które będą współdziałać z użytkownikiem.
W wielu sytuacjach nie jest bardzo przyjazne dla użytkownika konstruowanie obiektu z zerowymi wartościami, tak jak zrobiliśmy to z prostokątem w poprzednim rozdziale, a następnie prośba o wypełnienie wartości Wysokości i Szerokości w panelu Właściwości. To działa dla bardzo niewielkiej liczby obiektów, ale stanie się bardzo uciążliwe, jeśli trzeba będzie tworzyć wiele prostokątów. Lepszym sposobem byłoby już podanie Wysokości i Szerokości podczas tworzenia prostokąta.
Python oferuje podstawowe narzędzie do wprowadzania tekstu na ekranie:
text = raw_input("Height of the rectangle?") print("The entered height is ",text)
Wymaga to jednak aktywnej konsoli Python, a kiedy uruchamiamy nasz kod z makrodefinicji, nie zawsze mamy pewność, że konsola Python będzie aktywna.
Graficzny interfejs użytkownika (GUI) - zawierający menu, widoku 3D i inne wizualne komponenty programu FreeCAD - jest zaprojektowany tak, aby uczynić program intuicyjnym i dostępnym. Stanowi pomost między użytkownikiem i wewnętrznymi funkcjami środowiska FreeCAD, pozwalając na efektywną interakcję z programem zarówno początkującym użytkownikom, jak i ekspertom.
GUI programu FreeCAD jest zbudowane przy pomocy Qt, potężnego i otwartego zestawu narzędzi GUI, które zapewnia szeroki zakres funkcji. Qt oferuje podstawowe bloki do projektowania interfejsu, takie jak oknia dialogowe, przyciski, etykiety, pola do wprowadzania tekstu i menu rozwijane, zbiorczo nazywane "widżetami". Te widżety tworzą podstawę doświadczenia użytkownika programu FreeCAD.
Jedną z kluczowych zalet Qt jest jego międzyplatformowa kompatybilność, umożliwiając bezproblemowe uruchamianie programu FreeCAD na różnych systemach operacyjnych, takich jak Windows, macOS i Linux. Ponadto, elastyczność Qt ułatwia deweloperom rozszerzanie i dostosowywanie interfejsu programu FreeCAD poprzez tworzenie nowych pasków narzędzi i menu lub budowanie całkowicie nowych modułów, które integrują się z programem. Ta adaptacyjność sprawia, że FreeCAD pozostaje przyjazny użytkownikom i znacząco rozszerzalny.
Dla użytkowników zainteresowanych tworzeniem skryptów lub opracowywaniem nowych narzędzi, API Pythona programu FreeCAD również daje dostęp do wielu funkcji Qt. Oznacza to, że możesz nie tylko automatyzować zadania, ale również tworzyć własne widżety lub okna dialogowe, które są integrowane bezpośrednio ze środowiskiem FreeCAD.
Narzędzia Qt są bardzo łatwe do użycia z poziomu Pythona dzięki modułowi Pythona o nazwie PySide. PySide to oficjalny moduł Pythona do biblioteki Qt, zapewniający bezpośredni sposób tworzenia i interakcji z widżetami poprzez programowanie. Pozwala deweloperom projektować interfejsy, zarządzać wprowadzaniem danych przez użytkowników (np. odczytywanie tekstu z pól wejściowych) i definiować akcje w oparciu o interakcje użytkowników, takie jak odpowiadanie na wciśnięcie przycisku. Używając PySide, możesz budować własne okna dialogowe, menu i paski narzędzi bezpośrednio z poziomu programu FreeCAD, rozszerzając jego funkcjonalność w sposób, który integruje się bezpośrednio z jego istniejącym interfejsem.
PySide ułatwia połączenie akcji użytkownika z określonymi funkcjami w kodzie. Przykładowo, możesz ustawić przycisk tak, że gdy jest on wciśnięty, uruchamia skrypt wykonujący polecenie lub modyfikujący obiekt w widoku 3D. Ta interaktywna funkcjonalność otwiera nieograniczone możliwości dostosowywania przepływów pracy i automatyzowania powtarzalnych czynności.
Qt udostępnia również inne interesujące narzędzie o nazwie Qt Designer, które jest obecnie wbudowane w większą aplikację o nazwie Qt Creator. Umożliwia ono graficzne projektowanie okien dialogowych i paneli interfejsu, zamiast konieczności ich ręcznego kodowania. W tym rozdziale użyjemy Qt Creator do zaprojektowania widżetu panelu, którego użyjemy w panelu Zadanie programu FreeCAD. Będziesz więc musiał pobrać i zainstalować Qt Creator z oficjalnej strony QT, jeśli korzystasz z systemu Windows lub Mac (w systemie Linux będzie on zwykle dostępny w aplikacji menedżera oprogramowania).
W poniższym ćwiczeniu najpierw utworzymy panel za pomocą Qt Creator, który poprosi o podanie wartości długości, szerokości i wysokości, a następnie utworzymy wokół niego klasę Python, która odczyta wartości wprowadzone przez użytkownika z panelu i utworzy pudełko o podanych wymiarach. Ta klasa Python będzie następnie używana przez FreeCAD do wyświetlania i sterowania panelem zadań:
Zacznijmy od stworzenia widżetu. Uruchom Qt Creator, a następnie menu File → New File or Project → Qt → Qt Designer Form → Dialog without buttons. Kliknij Dalej, nadaj mu nazwę pliku do zapisania, kliknij Dalej, pozostaw wszystkie pola projektu do wartości domyślnej ("<none>") i Utwórz. System zadań FreeCAD automatycznie doda przyciski OK / Anuluj, dlatego wybraliśmy tutaj okno dialogowe bez przycisków.
import FreeCAD,FreeCADGui,Part
# CHANGE THE LINE BELOW
path_to_ui = "C:\Users\yorik\Documents\dialog.ui"
class BoxTaskPanel:
def __init__(self):
# this will create a Qt widget from our ui file
self.form = FreeCADGui.PySideUic.loadUi(path_to_ui)
def accept(self):
length = self.form.BoxLength.value()
width = self.form.BoxWidth.value()
height = self.form.BoxHeight.value()
if (length == 0) or (width == 0) or (height == 0):
print("Error! None of the values can be 0!")
# we bail out without doing anything
return
box = Part.makeBox(length,width,height)
Part.show(box)
FreeCADGui.Control.closeDialog()
panel = BoxTaskPanel()
FreeCADGui.Control.showDialog(panel)
W powyższym kodzie użyliśmy wygodnej funkcji PySideUic.loadUi z modułu FreeCADGui. Funkcja ta ładuje plik .ui, tworzy z niego widżet Qt i mapuje nazwy, dzięki czemu możemy łatwo uzyskać dostęp do podwidżetu według ich nazw (np. self.form.BoxLength).
Funkcja "akceptuj" jest również udogodnieniem oferowanym przez Qt. Gdy w oknie dialogowym znajduje się przycisk "OK" (co ma miejsce domyślnie podczas korzystania z panelu zadań FreeCAD), każda funkcja o nazwie "akceptuj" zostanie automatycznie wykonana po naciśnięciu przycisku "OK". Podobnie, można również dodać funkcję "odrzuć", która zostanie wykonana po naciśnięciu przycisku "Anuluj". W naszym przypadku pominęliśmy tę funkcję, więc naciśnięcie przycisku "Anuluj" spowoduje domyślne zachowanie (nic nie robi i zamyka okno dialogowe).
Jeśli zaimplementujemy którąkolwiek z funkcji akceptacji lub odrzucenia, ich domyślne zachowanie (nic nie rób i zamknij) nie będzie już występować. Musimy więc sami zamknąć panel zadań. Odbywa się to za pomocą:
FreeCADGui.Control.closeDialog()
Gdy mamy już nasz BoxTaskPanel, który ma 1 - widżet o nazwie "self.form" i 2 - w razie potrzeby funkcje akceptacji i odrzucenia, możemy otworzyć panel zadań za jego pomocą, co odbywa się za pomocą tych dwóch ostatnich wierszy:
panel = BoxTaskPanel()
FreeCADGui.Control.showDialog(panel)
Należy pamiętać, że widżet utworzony przez PySideUic.loadUi nie jest specyficzny dla FreeCAD, jest to standardowy widżet Qt, który może być używany z innymi narzędziami Qt. Moglibyśmy na przykład wyświetlić za jego pomocą osobne okno dialogowe. Wypróbuj to w konsoli Python FreeCAD (oczywiście używając poprawnej ścieżki do pliku .ui):
from PySide import QtGui
w = FreeCADGui.PySideUic.loadUi("C:\Users\yorik\Documents\dialog.ui")
w.show()
Oczywiście nie dodaliśmy żadnego przycisku "OK" lub "Anuluj" do naszego okna dialogowego, ponieważ zostało ono stworzone do użycia z panelu zadań FreeCAD, który już zapewnia takie przyciski. Nie ma więc możliwości zamknięcia okna dialogowego (poza naciśnięciem przycisku zamykania okna). Ale funkcja show() tworzy niemodalne okno dialogowe, co oznacza, że nie blokuje reszty interfejsu. Tak więc, gdy nasze okno dialogowe jest nadal otwarte, możemy odczytać wartości pól:
w.BoxHeight.value()
Jest to bardzo przydatne do testowania.
Wreszcie, nie zapominaj, że istnieje znacznie więcej dokumentacji na temat korzystania z widżetów Qt na FreeCAD Wiki, na stronie Centrum Power użytkowników, która zawiera poradnik Tworzenie dialogu, specjalny 3-częściowy poradnik PySide, który obszernie omawia ten temat.